package model.matrizes;

import java.util.Arrays;

public class MatrizBidimensional
{

    private MatrizBidimensional()
    {
    } // classe estática

    public static void transposta(Object[][] matriz)
    {
	Object[][] copia = copiar(matriz);
	for (int i = 0; i < copia.length; i++)
	{
	    for (int j = 0; j < copia[0].length; j++)
	    {
		matriz[j][i] = copia[i][j];

	    }
	}
    }

    /**
     * Não copia os objetos internos, só a matriz.
     * 
     * @param matriz
     * @return
     */
    public static Object[][] copiar(Object[][] matriz)
    {
	Object[][] copia = new Object[matriz.length][matriz[0].length];
	for (int i = 0; i < matriz.length; i++)
	{
	    copia[i] = Arrays.copyOf(matriz[i], matriz.length);
	}
	return copia;
    }

    /**
     * Ultima coluna será a primeira, a penultima, a segunda e assim por diante.
     * 
     * @param matriz
     */
    public static void espelharColunas(Object[][] matriz)
    {
	transposta(matriz); // O(nm) -> n é número de linhas e m o de colunas.
	espelharLinhas(matriz); // O(m)
	transposta(matriz); // O(nm)
	// O(m(2n+1)) Poderia ser menos custoso, mas não é necessário otimizar agora.
    }

    /**
     * Ultima linha será a primeira, a penultima, a segunda e assim por diante.
     * 
     * @param matriz
     */
    public static void espelharLinhas(Object[][] matriz)
    {
	Object[][] copia = copiar(matriz);
	int linha_copia = 0;
	for (int i = matriz.length - 1; i >= 0; i--)
	{
	    linha_copia = matriz.length - 1 - i;
	    for (int j = 0; j < matriz[0].length; j++)
	    {
		matriz[i][j] = copia[linha_copia][j];
	    }
	}
    }

}